package org.linlinjava.litemall.wx.service;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.linlinjava.litemall.core.util.ResponseUtil;
import org.linlinjava.litemall.db.domain.LitemallOrder;
import org.linlinjava.litemall.db.domain.LitemallUser;
import org.linlinjava.litemall.db.service.LitemallMoneyLogService;
import org.linlinjava.litemall.db.service.LitemallOrderService;
import org.linlinjava.litemall.db.service.LitemallPointsRecordService;
import org.linlinjava.litemall.db.service.LitemallUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 订单服务
 *
 * <p>
 * 订单状态：
 * 101 订单生成，未支付；102，下单后未支付用户取消；103，下单后未支付超时系统自动取消
 * 201 支付完成，商家未发货；202，订单生产，已付款未发货，但是退款取消；
 * 301 商家发货，用户未确认；
 * 401 用户确认收货； 402 用户没有确认收货超过一定时间，系统自动确认收货；
 *
 * <p>
 * 用户操作：
 * 当101用户未付款时，此时用户可以进行的操作是取消订单，或者付款操作
 * 当201支付完成而商家未发货时，此时用户可以取消订单并申请退款
 * 当301商家已发货时，此时用户可以有确认收货的操作
 * 当401用户确认收货以后，此时用户可以进行的操作是删除订单，评价商品，申请售后，或者再次购买
 * 当402系统自动确认收货以后，此时用户可以删除订单，评价商品，申请售后，或者再次购买
 */
@Service
public class XiaofeiquanPay {
    private final Log logger = LogFactory.getLog(XiaofeiquanPay.class);

    @Autowired
    private LitemallUserService userService;
    @Autowired
    private LitemallOrderService orderService;

    @Autowired
    private LitemallMoneyLogService moneyLogService;
   // private ExecutorService executorService = Executors.newFixedThreadPool(20);

    @Autowired
    private LitemallPointsRecordService pointsRecordService;

    @Autowired
    WxOrderService wxOrderService;

    /**
     * 建立一个  lock 轻锁 ，支付 最好还是 同步 ，所以使用同步锁
     */
    private Lock lock = new ReentrantLock();

@Transactional
    public Object paybyxfq(LitemallOrder litemallOrder,Integer userId) {
        int  ztm=0; //状态码 ,使用状态码的原因是因为 使用了线程锁， 在没有执行finally {lock.unlock(); 之前跳出 ，会导致线程死锁，，服务卡死，虽然可以写在else，但我就不写
        String  ts="";//提示内容
        //验证 合法性
        System.out.println(litemallOrder.getUserId().intValue() != userId.intValue());
        if(userId.intValue() != litemallOrder.getUserId().intValue()){
            return ResponseUtil.fail(501,"登录用户与订单用户，不一致，非法操作");
        }
       // System.out.println(litemallOrder.getOrderStatus());
        if(litemallOrder.getOrderStatus()!=101){
            return ResponseUtil.fail(504,"订单信息发生变动，请刷新重试");
        }

        try {
            //消费券使用同步锁  没有问题
            lock.lock();
            ztm=0;
            LitemallUser user=userService.findById(userId);
            if(user!=null){
                //当前用户消费券
                //double  myxfq=user.getXiaofeiquan();
                double  myxfq=user.getIntegral(); // 改成积分支付
                //当前订单需要支付的费用
                double  price= Double.parseDouble(litemallOrder.getOrderPrice().toString());
                //计算 够不够消费券
                if(myxfq-price>=0.00){
                    //在消费券足够的情况下 用户减去 消费券 ，订单变201  ，记录日志
                    //userService.payxiaofeiquan(userId,myxfq-price);
                    user.setIntegral(myxfq-price);
                    userService.updateById(user);
                    LocalDateTime now = LocalDateTime.now();
                    orderService.payxiaofeiquan(litemallOrder.getId(),now);// 更新支付时间
                    moneyLogService.insertMoney(price,0.00,"用户使用消费券购买商品",userId,"消费券",0,myxfq-price,litemallOrder.getId());
                    pointsRecordService.pay(userId, price, litemallOrder); // 记录积分变动


                    // 给代理分配奖励---梨膏糖
                    //Double integral = price;
                    //wxOrderService.updateUserIntegral(userId,integral);

                }else {
                    ztm=2;
                    ts=""+myxfq;
                }
            }else {
                ztm=1;
            }

        } catch (Exception e ) {
            e.printStackTrace();
        } finally {

            lock.unlock();

        }
/**
 * ztm  ==1   没有这个用户
 *        2   余额不足
 */
    if(ztm==1){
        return   ResponseUtil.fail(501,"登录信息异常，请重新登录");
    }else if (ztm==2){
        return  ResponseUtil.fail(401,"余额不足，当前剩余消费券：" + ts);
    }
    return ResponseUtil.ok("支付成功");

    }

}
